﻿/**
 * @file platform_link.h
 * @date 2021/07/15 14:07
 *
 * @author harrybao (harrybao@123u.com)
 *
 * @brief PlatformLink
 *
 * @version v1.0.0
 *
 * @copyright Copyright © 2021 All Rights Reserved 上海欢乐互娱网络科技有限公司
 *
 * @par history:
 * <table>
 * <tr><th>Date                     <th>Version     <th>Author <th>Description
 * <tr><td>2021/07/15 14:07         <td>1.0.0       <td>harrybao
 * <td>创建初始版本
 * </table>
 */

#pragma once

#include <string>
#include <memory>
#include "knet/knet.h"
#include "rpc_root.h"
#include "rpc_proxy.h"
#include "logger.h"
#include "transport.h"


namespace link_util {

/**
 * @brief PlatformLink基类
 *
 */
class PlatformLink {
 public:
  PlatformLink() {}
  virtual ~PlatformLink() {}
  /**
   * 初始化中台环境
   * @method: Init
   * @return: bool 是否初始化成功
   */
  virtual bool Init() = 0;

  /**
   * 销毁中台环境
   * @method: UnInit
   * @return: void 空
   */
  virtual void UnInit() = 0;

  /**
   * 连接指定IP和端口
   * @method: Connect
   * @param: std::string ip ip地址
   * @param: std::uint32_t port 端口号
   * @return: bool 是否连接成功
   */
  virtual bool Connect(const std::string &ip, std::uint32_t port) = 0;

  /**
   * 更新网络和RPC事件
   * @method: Update
   * @return: void 空
   */
  virtual void Update() = 0;

  /**
   * 根据代理模版参数创建代理对象
   * @method: createProxy
   * @return: std::shared_ptr<T> 创建的代理指针对象
   */
  template <typename T>
  std::shared_ptr<T> CreateProxy();

 private:
  /**
   * 获取RpcImpl对象基类指针
   * @method: GetRpc
   * @return: rpc::Rpc* 返回RpcImpl对象基类指针
   */
  virtual rpc::Rpc* GetRpc() = 0;

  /**
   * 获取网络连接对象
   * @method: GetTransport
   * @return: std::shared_ptr<rpc::Transport> 返回网络连接对象指针
   */
  virtual std::shared_ptr<rpc::Transport> GetTransport() = 0;
  
  /**
   * @brief 协程启动
   * 
   * SDK不对外提供协程功能
   * @param entry 协程入口函数
   */
  virtual void CoroStart(const coroutine::CoroEntry &entry) = 0;

};

template <typename T>
std::shared_ptr<T> PlatformLink::CreateProxy() {
  return rpc::createProxy<T>(GetTransport(), true, GetRpc());
}

}  // namespace link_util